#pragma once

#include <vector>
#include <list>
#include <deque>

// 这里的栈和我们在C语言里面实现的栈不太一样
// 我们在C语言里面的栈实现,是单独作为一个数据结构去模拟实现了它的功能,需要重写很多里面的操作逻辑
// 但是在实际上,我们可以发现栈这个结构是可以使用不同的数据结构实现的,本身其实可以借助其他数据结构的功能去实现本身的功能
// 所以,在c++里面,栈这一个结构通过泛型编程的功能,变成了一个容器适配器,通过包装其他的数据结构,调用它的功能来实现本身的功能

namespace gojo
{

    // 适配器/配接器
    // 容器适配器

    template<class T , class Container = deque> // 模板也可以使用缺省参数,这样子就可以在默认的情况下不用指定容器的数据结构,栈的可以适配所有结构
    class stack
    {

        private:
            
            Container _con ; // 通过适配不同数据结构以及其功能来实现本身这一个结构

        public:


    // 默认的构造函数在栈初始化的时候就回自动调用相应结构的构造,非常方便


    // 增

            void push ()
            {

                _con.push_back (x) ; // 本身的功能也可以通过调用结构的功能实现

            }

    
    // 删

            void pop ()
            {

                _con.pop_back () ;

            }

    
    // 查

            size_t size () const
            {

                return _con.size () ;

            }

            bool empty () const
            {

                return _con.empty () ;

            }

            const T& top () const
            {

                return _con.back () ;

            }

            T& top ()
            {

                return _con.back () ;

            }

    } ;

}